home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 026-050 / scopedisk33 / dmouse11 / dmouse.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  6KB  |  232 lines

  1.  
  2. /*
  3.  *  DMOUSE.C    V1.10  31 July 1988    (Aztec Compile, +L  ... 32 bit ints)
  4.  *                     and link w/ c32.lib
  5.  *
  6.  *  DMOUSE QUIT
  7.  *  DMOUSE -a# -t# -s# -m# -c# -p# -w# -Ln -lqqqq -Rqqqq -An -Kcccc -Qqqqq -C cmd
  8.  *
  9.  *  -a#     # = acceleration, default 3.    1 to disable
  10.  *  -t#     # = mouse threshold before acceleration takes effect, def. 0
  11.  *        (in pixels/event)
  12.  *  -s#     # = screen timeout, default 5min,    0 to disable
  13.  *  -m#     # = pointer timeout, default 5 secs,0 to disable
  14.  *  -c#     # = # of clicks to bring window to front
  15.  *  -p#     # = input device priority
  16.  *  -w#     1 = Use WindowToFront()/WindowToBack()  else    (workbench users)
  17.  *        0 = Use UpFrontLayer(), etc...                  (cli users)
  18.  *  -L0     Disable LeftMouseButton->WindowToFront (LMB+RMB->ToBack)
  19.  *  -L1     Enable it
  20.  *  -lqqqq  Set qualifier + LMB for Window to front (default none)
  21.  *  -Rqqqq  Set qualifier + RMB for Window/ScreenToBack (default LMB)
  22.  *  -A0     Disable Auto-Activate window on mouse move
  23.  *  -A1     Enable it, keyhit-auto-activate disabled    (bit 0 = mouse aa)
  24.  *  -A3     Enable it, keyhit-auto-activate enabled    (bit 1 = key aa)
  25.  *  -Kcccc  Set key code in hex that activates cmd, def is escape
  26.  *  -Qqqqq  Set key qualifier in hex for keycode, def is left-amiga
  27.  *  -C cmd  Set command (must be last option on command line), def NewCli
  28.  */
  29.  
  30. #include <stdio.h>
  31. #include "dmouse.h"
  32.  
  33. #define VERSION 10
  34.  
  35. int    Enable_Abort;        /*    CLI break enable    */
  36.  
  37. main(ac, av)
  38. char *av[];
  39. {
  40.     register short i, j, len;
  41.     register long val;
  42.     register char *ptr;
  43.     register DMS  *dms = (DMS *)FindPort(PORTNAME);
  44.     short   exists = (dms != NULL);
  45.     short   create = (dms == NULL);
  46.     short   quit = 0;
  47.  
  48.     Enable_Abort = 0;
  49.     if (create) {
  50.     dms = AllocMem(sizeof(DMS), MEMF_PUBLIC|MEMF_CLEAR);
  51.     dms->IPri = 51;
  52.     dms->Version = VERSION;
  53.     dms->Acc = 3;
  54.     dms->STo = 5*60;
  55.     dms->MTo = 5;
  56.     dms->Code = 0x45;
  57.     dms->Qual = 0x8040;
  58.     dms->RQual= 0x4000;
  59.     dms->Clicks = 1;
  60.     dms->CLeft = dms->Clicks;
  61.     strcpy(dms->Cmd, "newcli");
  62.     dms->LMBEnable = 1;
  63.     dms->AAEnable = 3;
  64.     dms->NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
  65.     dms->NoSprData[0] = 0xFE00;
  66.     dms->NoSprData[1] = 0xFF00;
  67.     }
  68.  
  69.     for (i = 1; i < ac; ++i) {
  70.     ptr = av[i];
  71.     if (strcmp(ptr, "QUIT") == 0 || strcmp(ptr, "quit") == 0) {
  72.         quit = 1;
  73.         create = 0;
  74.         break;
  75.     }
  76.     val = atoi(ptr+2);
  77.     if (*ptr != '-')
  78.         goto def;
  79.  
  80.     switch(ptr[1]) {
  81.     case 'a':
  82.         dms->Acc = val;
  83.         break;
  84.     case 'c':
  85.         if (val < 1)
  86.         val = 1;
  87.         dms->Clicks = dms->CLeft = val;
  88.         break;
  89.     case 'w':
  90.         dms->Workbench = val;
  91.         break;
  92.     case 'p':
  93.         dms->IPri = val;
  94.         break;
  95.     case 't':
  96.         dms->AThresh = val;
  97.         break;
  98.     case 's':
  99.         dms->STo = val;
  100.         break;
  101.     case 'm':
  102.         dms->MTo = val;
  103.         break;
  104.     case 'L':
  105.         dms->LMBEnable = val;
  106.         break;
  107.     case 'l':
  108.         dms->LQual = ahtoi(ptr+2);
  109.         break;
  110.     case 'R':
  111.         dms->RQual = ahtoi(ptr+2);
  112.         break;
  113.     case 'A':
  114.         dms->AAEnable = val;
  115.         break;
  116.     case 'K':
  117.         dms->Code = ahtoi(ptr+2);
  118.         break;
  119.     case 'Q':
  120.         dms->Qual = ahtoi(ptr+2) | 0x8000;
  121.         break;
  122.     case 'C':
  123.         for (len = strlen(ptr+2) + 2, j = i + 1; j < ac; ++j)
  124.         len += strlen(av[j]) + 1;
  125.         strcpy(dms->Cmd, ptr + 2);
  126.         for (j = i + 1; j < ac; ++j) {
  127.         if (dms->Cmd[0])
  128.             strcat(dms->Cmd, " ");
  129.         strcat(dms->Cmd, av[j]);
  130.         }
  131.         i = ac;
  132.         break;
  133.     default:    def:
  134.         puts("DMOUSE QUIT  or");
  135.         puts("DMOUSE -a# -t# -s# -m# -Ln -Rqqqq -An -Kcccc -Qqqqq -C cmd");
  136.         printf("V1.%02d PUBLIC DOMAIN, Matthew Dillon, 28 June 1988\n\n", VERSION);
  137.         puts("  -a#     Acceleration (default 3)");
  138.         puts("  -t#     Accel. threshold (default 0)");
  139.         puts("  -s#     Screen timeout (default 300)");
  140.         puts("  -m#     Mouse timeout (default 5)");
  141.         puts("  -c#     Set # of clicks for wintofront (default 1)");
  142.         puts("  -p#     # = input device priority");
  143.         puts("  -w#     0 = use UpFrontLayer().. 1 = use WindowToFront()");
  144.         puts("  -L0/1   LMB disable/enable (default 1=enabled)");
  145.         puts("  -lqqqq  LMB qualifier wintofront (default 0=none)");
  146.         puts("  -Rqqqq  RMB qualifier wintoback (default 4000=LMB)");
  147.         puts("  -A0-3   Auto-Activate Window disable/enable. B0=mouse B1=keyboard");
  148.         puts("  -Kcccc  Command Key Code, default 45 = esc");
  149.         puts("  -Qqqqq  Command Key Qualifier, default 40 = Left Amiga");
  150.         puts("  -C cmd  cmd to run, must be last option");
  151.         puts("Note: LMB(or -R qualifier)(hold)+RMB = WindowToBack");
  152.         puts("\n");
  153.         puts("Additionaly, Most options may be modified while DMOUSE is active");
  154.         create = 0;
  155.         i = ac;
  156.         break;
  157.     }
  158.     }
  159.     dms->Reset = 1;
  160.     if (!exists && create) {
  161.     PROC *proc;
  162.     printf("Installing DMouse, ");
  163.     fflush(stdout);
  164.     dms->Port.mp_Flags = PA_IGNORE;
  165.     dms->Port.mp_Node.ln_Pri = 0;
  166.     dms->Port.mp_Node.ln_Type= NT_MSGPORT;
  167.     dms->Port.mp_Node.ln_Name= AllocMem(sizeof(PORTNAME), MEMF_PUBLIC);
  168.     strcpy(dms->Port.mp_Node.ln_Name, PORTNAME);
  169.     NewList(&dms->Port.mp_MsgList);
  170.     dms->Segment = LoadSeg("l:DMouse-Handler");
  171.     if (!dms->Segment)
  172.         dms->Segment = LoadSeg("DMouse-Handler");
  173.     if (!dms->Segment) {
  174.         puts("Unable to find L:DMouse-Handler");
  175.         FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  176.         create = 0;
  177.     } else {
  178.         AddPort(&dms->Port);
  179.         dms->ShakeTask = FindTask(NULL);
  180.         dms->ShakeSig = AllocSignal(-1);
  181.         proc = CreateProc(dms->Port.mp_Node.ln_Name, 1, dms->Segment, 4096);
  182.         Wait(1 << dms->ShakeSig);
  183.         FreeSignal(dms->ShakeSig);
  184.         exists = 1;
  185.         quit = dms->StartupError;
  186.         if (quit)
  187.         puts("Handler error");
  188.         else
  189.         printf("ok.  DMouse V1.%02d, by Matthew Dillon.  PUBLIC DOMAIN.\n", VERSION);
  190.     }
  191.     }
  192.     if (quit) {
  193.     if (exists) {
  194.         printf("Removing, ");
  195.         fflush(stdout);
  196.         dms->ShakeTask = FindTask(NULL);
  197.         dms->ShakeSig = AllocSignal(-1);
  198.         Signal(dms->HandTask, SBF_C);
  199.         Wait(1 << dms->ShakeSig);
  200.         FreeSignal(dms->ShakeSig);
  201.         RemPort(&dms->Port);
  202.         FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  203.         UnLoadSeg(dms->Segment);
  204.         puts("ok");
  205.     }
  206.     exists = 0;
  207.     create = 0;
  208.     }
  209.     if (!exists) {
  210.     FreeMem(dms->NoSprData, 12);
  211.     FreeMem(dms, sizeof(DMS));
  212.     }
  213. }
  214.  
  215. ahtoi(str)
  216. register char *str;
  217. {
  218.     register long val = 0;
  219.     register char c;
  220.     while (c = *str) {
  221.     val <<= 4;
  222.     if (c >= '0' && c <= '9')
  223.         val |= (c & 15);
  224.     else
  225.         val |= (c & 15) + 9;
  226.     ++str;
  227.     }
  228.     return(val);
  229. }
  230.  
  231.  
  232.